package com.blackcat.dynamicexcel.demo.service;

import com.blackcat.dynamicexcel.service.DynamicExcelService;
import com.blackcat.dynamicexcel.vo.ExcelCellData;
import com.blackcat.dynamicexcel.vo.RowData;
import com.blackcat.dynamicexcel.vo.SheetData;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.ibatis.util.MapUtil;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.blackcat.dynamicexcel.utils.DynamicExcelUtil.isField;

/**
 * 动态 Excel 模板补充方法
 * @author zhanghui
 * @cteateTime 2023/12/1 16:54
 */
@Service
public class DynamicExcelAnewService extends DynamicExcelService {

    /**
     * 自定义入库数据库动作
     * @author : zhanghui
     * @cteateTime : 2023/12/11 10:14
     * @param excelSheetDataList Excel 数据
     * @param additionalParam 额外自定义补充参数
    */
    @Override
    public Integer saveDatabase(List<SheetData> excelSheetDataList, Map<String,Object> additionalParam) {
        if (CollectionUtils.isNotEmpty(excelSheetDataList)) {
            for (SheetData sheetData : excelSheetDataList) {
                List<RowData> rowData = sheetData.getSuccessList();
                if (CollectionUtils.isNotEmpty(rowData)) {
                    rowData.forEach(row -> {
                        // row.getFields() 字段数据 key：字段名称  value：字段值
                        System.out.println(row.getFields());
                        // 合并组数据
                        // Map<String,List<RowDataSubObject>> groupList;
                    });
                }
            }
        }
        return 200;
    }

    /**
     * 补充 Excel 单元格数据自定义验证
     * @author : zhanghui
     * @cteateTime : 2023/12/11 10:15
     * @param cell 单元格数据
     * @param translateCodeMap 枚举信息
     * @param errorText 错误信息
     * @param additionalParam 额外自定义补充参数
    */
    @Override
    public void supplementCustomCellCheck(ExcelCellData cell, Map<String,Map<String,String>> translateCodeMap, StringBuffer errorText, Map<String,Object> additionalParam){
        // 此部分用于单元格数据补充校验。例如：查询待审核表中是否有相同数据。
        Integer isAudit = (Integer) additionalParam.get("isAudit");
        if (isAudit != null) {
            System.out.println("获取额外自定义补充参数 isAudit:"+isAudit);
        }
        // 自定义验证补充
        if (isField(cell,"attribute")) {
            if (!cell.getCellValue().equals(cell.getSheetName())){
                errorText.append("【").append(cell.getHeaderName()).append("】列")
                        .append("：“").append(cell.getCellValue()).append("“ ").append("指标属性必须和模板名称一致；\n");
            }
        }
    }

    /**
     *
     * @author : zhanghui
     * @cteateTime : 2023/12/11 10:17
     * @param row 行数据
     * @param translateCodeMap 枚举信息
     * @param errorText 错误信息
     * @param additionalParam 额外自定义补充参数
    */
    @Override
    public void supplementCustomRowCheck(RowData row, Map<String,Map<String,String>> translateCodeMap, StringBuffer errorText, Map<String,Object> additionalParam){
        // 此部分用于行数据补充校验。例如：列A的校验依赖于列B的数据，或根据额外补充参数校验。
        List<ExcelCellData> cells = row.getCells();
        if (CollectionUtils.isNotEmpty(cells)) {

        }
    }


    /**
     * 额外自定义枚举信息
     * @author : zhanghui
     * @cteateTime : 2023/12/11 10:16
     * @param translateCodeMap 已查询枚举信息
    */
    @Override
    public Map<String, Map<String, String>> supplementTranslateCodeMap(Map<String, Map<String, String>> translateCodeMap) {
        // 此部分用于添加额外枚举信息。例如：需要查询拥有指定权限的部门用户或不在枚举表中的枚举。
        // 审核部门
        Map<String, String> deptMap = new HashMap<>();
        deptMap.put("001", "质量部");
        deptMap.put("002", "数据部");
        translateCodeMap.put("auditDept", deptMap);
        // 审核人员
        Map<String, String> userMap = new HashMap<>();
        userMap.put("001", "王五");
        userMap.put("002", "赵六");
        translateCodeMap.put("auditUser", userMap);
        return super.supplementTranslateCodeMap(translateCodeMap);
    }
}
